/**********************************************
* @file    	systick.c
* @author 	dralee
* @version	v1.0
* @date			2021-12-01
* @brief		系统定时器
***********************************************/
#include "systick.h"

static __IO u32 TimingDelay;

/**
 *****************************************
 * @brief 配置系统定时器
 * @param 无
 * @retval 无
 *****************************************/
void SysTick_Init(void)
{
	if(SysTick_Config(SystemCoreClock / 100000)) // 10us，返回1失败
	{
		// 错误
		while(1);
	}
}

/**
 *****************************************
 * @brief 延时指定微秒【中断方式】
 * @param xus 微秒数，以10us为单位
 * @retval 无
 *****************************************/
void Delay_xus(__IO uint32_t xus)
{
	TimingDelay = xus;
	SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; // 使能滴答定时器
	while(TimingDelay != 0);
}

/**
 *****************************************
 * @brief 获取节拍，SysTick_Handler()中调用
 * @param 无
 * @retval 无
 *****************************************/
void TimingDelay_Decrement(void)
{
	if(TimingDelay != 0x00)
	{
		TimingDelay--;
	}
}

/**
 *****************************************************
 * @brief 滴答时钟中断处理
 * @param 无
 * @retval 无
 * @attention 为了方便直接脱离使用，抽取至sysTick.c中
 *****************************************************/
void SysTick_Handler(void)
{
	TimingDelay_Decrement();	
}

////////////////////////以下使用查询方式延时//////////////////////////
/**
 *********************************************************************
 * @brief 延时指定微秒【查询方式】
 * @param us 微秒数
 * @retval 无
 * @attention counter减1的时间等于 1/systick_clk
 * 	当counter从reload值减小到0时，为一个循环，如果开启了中断服务程序，
 *	同时CTRL的countflag位会置1，该循环时间为 reload*(1/systick_clk)
 *********************************************************************/
void SysTick_Delay_us(__IO uint32_t us)
{
	uint32_t i;
	SysTick_Config(SystemCoreClock/1000000);
	for(i = 0; i < us; i++)
	{
		while(!((SysTick->CTRL)&(1<<16))); // 当计数器值减小到0时，CTRL寄存器位16会置1，读取该位会置0
	}
	SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; // 关闭SysTick定时器
}

/**
 *****************************************
 * @brief 延时指定毫秒【查询方式】
 * @param ms 毫秒数
 * @retval 无
 *****************************************/
void SysTick_Delay_ms(__IO uint32_t ms)
{
	uint32_t i;
	SysTick_Config(SystemCoreClock/1000);
	for(i = 0; i < ms; i++)
	{
		while(!((SysTick->CTRL)&(1<<16))); // 当计数器值减小到0时，CTRL寄存器位16会置1，读取该位会置0
	}
	SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; // 关闭SysTick定时器
}
